/**
 * CLASSE TelaRelatorios
 *
 * Esta classe contem toda a implementacao do menu de relatorios do sistema. 
 * No arquivo "SistemaAdvocacia.java", um objeto desta classe eh criado no
 * metodo "menuPrincipal" para representar o menu de relatorios dentro do 
 * codigo.
 */
 
//-------------------------------------------------------------------
// I M P O R T A C A O   D E   C L A S S E S   D A   A P I   J A V A
//-------------------------------------------------------------------
 
import java.util.Scanner;

/**
 * Inicio da especificacao da classe.
 */
public class TelaRelatorios {

//------------------------------------------------------
// A T R I B U T O S
//------------------------------------------------------

	/**
	 * Armazena uma referencia para o objeto da classe ListagemClientes utilizado
	 * por este menu.
	 */
	ListagemClientes listaClientes;
	
	/**
	 * Armazena uma referencia para o objeto da classe ListagemProcessos utilizado
	 * por este menu.
	 */
	ListagemProcessos listaProcessos;
	
	/**
	 * Armazena uma referencia para o objeto da classe ListagemEventosProcessos utilizado
	 * por este menu.
	 */
	ListagemEventosProcessos listaEventos;
	
	/**
	 * Armazena uma referencia para o objeto da classe ListagemDadosGerais utilizado
	 * por este menu. 
	 */
	ListagemDadosGerais dadosGerais;
	
//------------------------------------------------------
// C O N S T R U T O R E S
//------------------------------------------------------

	/**
	 * Unico construtor da classe. 
	 */
	public TelaRelatorios() {
		this.dadosGerais = new ListagemDadosGerais();
		this.listaClientes = new ListagemClientes();
		this.listaProcessos = new ListagemProcessos();
		this.listaEventos = new ListagemEventosProcessos();
	}

//------------------------------------------------------
// M E T O D O S
//------------------------------------------------------

	/**
	 * METODO menu
	 * 		Mostra o menu de relatorios do sistema e controla a execucao de cada opcao. 
	 */
	public void menu() {
	
		Scanner entrada = new Scanner(System.in);
		
		// Esta variavel serah usada para controlar o loop abaixo, implementado usando uma estrutura "while". Quando
		// o usuario escolher a opcao "Voltar ao menu principal", a variavel recebera o valor "true", que causara o
		// termino da repeticao.
		boolean sair = false;
		
		// Enquanto o usuario nao escolher sair do menu de relatorios...
		while(!sair) {
		
			// Mostra as opcoes do menu de turmas para o usuario.
			System.out.println("\n-------------- MENU RELATORIOS --------------\n");
			System.out.println("  Lista de opcoes disponiveis:                ");
			System.out.println("      1 - Listagem de Processos de um Cliente ");
			System.out.println("      2 - Listagem de Eventos de um Processo  ");
			System.out.println("      3 - Agenda de Compromissos de um Mes    ");
			System.out.println("      4 - Voltar ao menu principal          \n");
			
			// Solicita ao usuario que digite o numero da opcao escolhida.
			System.out.print  ("   >>> Digite sua opcao: ");
			int opcao = entrada.nextInt();
			
			// Este "while" repete a leitura da opcao escolhida pelo usuario ate que este informe uma opcao valida,
			// ou seja, um numero de 1 a 4.
			while(opcao < 1 || opcao > 4) {
				System.out.println("ERRO: Opcao invalida!");
				System.out.print  ("   >>> Digite sua opcao novamente: ");
				opcao = entrada.nextInt();
			}
			
			// Este "switch" esta sendo usado para a exibicao da tela selecionada pelo usuario no menu relatorios,
			// a partir do numero da opcao escolhida por ele.
			switch(opcao) {
			
				case 1  : // Opcao "Listagem de Processos de um Cliente". 
					listagemProcessosCliente();
					break;
					
				case 2  : // Opcao "Listagem de Eventos de um Processo".
					listagemEventosProcesso();
					break;
					
				case 3  : // Opcao "Agenda de Compromissos de um Mes".
					agendaCompromissosMes();
					break;
					
				case 4 : // Opcao de "Voltar ao menu principal".
					sair = true;
					
			} // Fim do switch iniciado na linha 145
			
			// Mostra uma mensagem informando ao usuario que o relatorio escolhido foi gerado com sucesso (isso
			// se o usuario nao escolheu voltar ao menu principal - opcao 4).
			if(opcao != 4) {
				System.out.println("\nRelatorio gerado com sucesso!");
				System.out.println("Pressione ENTER para continuar...");
				entrada.nextLine(); entrada.nextLine();
			}
			
		} // Fim do while iniciado na linha 111
		
	} // Fim do metodo menu iniciado na linha 92

	/**
	 * METODO listagemProcessosCliente
	 * 		Mostra e gerencia a tela de geracao do relatorio de listagem de processos de um cliente.
	 * Esta tela vai solicitar ao usuario que informe o codigo de um cliente e o nome do arquivo onde
	 * o relatorio deve ser salvo. A listagem de processos de um cliente mostra uma tabela contendo 
	 * a lista de todos os processos do cliente selecionado pelo usuario.
	 */
	public void listagemProcessosCliente() {
	
		Scanner entrada = new Scanner(System.in);
		Cliente c;
		
		// Mostra o titulo desta tela.
		System.out.println("\n-- GERA LISTAGEM DE PROCESSOS DE UM CLIENTE --");
		System.out.println();
		
		// Faz a leitura do codigo do cliente. A operacao eh repetida ateh que o usuario
		// informe um codigo que esteja cadastrado no sistema.
		do {
			System.out.print("Codigo do cliente...: ");
			int codCliente = Integer.parseInt(entrada.nextLine());
			c = listaClientes.consultaPorCodigo(codCliente);
			if(c == null)
				System.out.println("Cliente nao cadastrado! Digite novamente.");
		} while(c == null);
		
		// Faz a leitura do nome do arquivo onde serah salvo o relatorio gerado. O relatorio serah 
		// especificado utilizando a linguagem HTML.
		System.out.print("\nNome do arquivo onde o relatorio deve ser salvo: ");
		String nomeArq = entrada.nextLine();
		
		// Gera o relatorio
		RelListagemProcessosCliente relatorio = new RelListagemProcessosCliente(dadosGerais, c);
		relatorio.geraHTML(nomeArq);
		
	} // Fim do metodo listagemProcessosCliente
	
	/**
	 * METODO listagemEventosProcesso
	 * 		Mostra e gerencia a tela de geracao do relatorio de listagem de eventos de um processo.
	 * Esta tela vai solicitar ao usuario que informe o numero de um processo e o nome do arquivo onde
	 * o relatorio deve ser salvo. A listagem de eventos de um processo mostra uma tabela contendo 
	 * a lista de todos os eventos de um processo selecionado pelo usuario.
	 */
	public void listagemEventosProcesso() {
	
		Scanner entrada = new Scanner(System.in);
		Processo p;
		
		// Mostra o titulo desta tela.
		System.out.println("\n-- GERA LISTAGEM DE EVENTOS DE UM PROCESSO --");
		System.out.println();
		
		// Faz a leitura do numero do processo. A operacao eh repetida ateh que o usuario
		// informe um numero que esteja cadastrado no sistema.
		do {
			System.out.print("Numero do processo..: ");
			int numProcesso = Integer.parseInt(entrada.nextLine());
			p = listaProcessos.consultaPorNumero(numProcesso);
			if(p == null)
				System.out.println("Processo nao cadastrado! Digite novamente.");
		} while(p == null);
		
		// Faz a leitura do nome do arquivo onde serah salvo o relatorio gerado. O relatorio serah 
		// especificado utilizando a linguagem HTML.
		System.out.print("\nNome do arquivo onde o relatorio deve ser salvo: ");
		String nomeArq = entrada.nextLine();
		
		// Gera o relatorio
		RelListagemEventosProcesso relatorio = new RelListagemEventosProcesso(dadosGerais, p);
		relatorio.geraHTML(nomeArq);
		
	} // Fim do metodo listagemEventosProcesso
	
	/**
	 * METODO agendaCompromissosMes
	 * 		Mostra e gerencia a tela de geracao do relatorio de agenda de compromissos de um mes.
	 * Esta tela vai solicitar ao usuario que informe um mes de um ano e o nome do arquivo onde
	 * o relatorio deve ser salvo. A agenda de compromissos de um mes mostra uma tabela contendo 
	 * a lista de todos os eventos de processos que ocorrem durante o mes escolhido.
	 */
	public void agendaCompromissosMes() {
	
		Scanner entrada = new Scanner(System.in);
		
		// Mostra o titulo desta tela.
		System.out.println("\n--- GERA AGENDA DE COMPROMISSOS DE UM MES ---");
		System.out.println();
		
		// Faz a leitura dos dados do mes.
		System.out.print("Mes.: ");
		int mes = Integer.parseInt(entrada.nextLine());
		System.out.print("Ano.: ");
		int ano = Integer.parseInt(entrada.nextLine());
		
		// Faz a leitura do nome do arquivo onde serah salvo o relatorio gerado. O relatorio serah 
		// especificado utilizando a linguagem HTML.
		System.out.print("\nNome do arquivo onde o relatorio deve ser salvo: ");
		String nomeArq = entrada.nextLine();
		
		// Consulta os eventos do mes
		EventoProcesso[] eventos = listaEventos.consultaPorMes(mes, ano);
		
		// Gera o relatorio
		RelAgendaCompromissosMes relatorio = new RelAgendaCompromissosMes(dadosGerais, mes, ano, eventos);
		relatorio.geraHTML(nomeArq);
		
	} // Fim do metodo agendaCompromissosMes
	
} // Fim da classe TelaRelatorios



